"""
date:2019/5/27
配置文件里不要包含特殊符号：%,\
"""
from telnetlib import Telnet
import re


class MyTelnet(Telnet):
    """
    第一个telnet版本，通过继承Telnet来实现。
    """
    def __init__(self, host_, port_, user, passwd):
        super().__init__(host_, port_)
        # self.write(b' \n')
        self.write(user.encode())
        self.write(b'\n')
        self.write(passwd.encode())
        self.write(b'\n')
        self.expect([b'<.+>'])
        self.write(b'dis cu\n')

    def fill_rawq(self):
        """
        重载Telnet中fill_rawq方法，让接收字节数量增加到1000，默认50。
        """
        if self.irawq >= len(self.rawq):
            self.rawq = b''
            self.irawq = 0
        buf = self.sock.recv(1000)      # 对接收的数据容量扩大，以避免一行不能完整的输出。
        self.msg("recv %r", buf)
        self.eof = (not buf)
        self.rawq = self.rawq + buf

    def run(self):
        while True:
            raw_msg = self.read_some()
            if re.search(b'<.+>', raw_msg):     # 搜到<*>的内容就代表本次全部输出结束，跳出循环。
                break
            if b'\x1b[42D                                          \x1b[42D' in raw_msg:    # 遇到特殊符号跳出本次循环。
                continue
            if b'More' in raw_msg:              # 遇到more时继续输出。
                self.write(b' \n')
                continue
            cooked_msg = raw_msg.decode()
            cooked_msg = cooked_msg.strip()     # 去空白行。
            print(cooked_msg)


class MyTelnet2:
    """
    第二个telnet版本，大数据用拼接的方式返回。
    有两个地方可能造成不能获取数据，一个是expect输入账号密码除，如果期待的字符串跟设备返回的不一致程序将卡在此处；
    还有一个是read_some用的是一个死循环，如果不能正确获取提示符包含的字符则程序将无法返回。
    date: 2020/12/30
    """
    def __init__(self, ip, user, pwd, cmd):
        self.telnet = Telnet(ip)
        self.telnet.expect([b'login:'])
        self.telnet.write(bytes(user, encoding='utf-8') + b'\n')
        self.telnet.expect([b'Password:'])
        self.telnet.write(bytes(pwd, encoding='utf-8') + b'\n')
        self.telnet.write(bytes(cmd, encoding='utf-8') + b'\n')

    def get(self):
        """
        将大数据内容进行拼接在输出。
        """
        count = 0
        message = b''
        while True:
            raw = self.telnet.read_some()
            message += raw
            if b'#' in raw:
                count += 1
            if count == 2:
                break

        return message


if __name__ == '__main__':
    tel = MyTelnet2('ip', 'user', 'pwd', 'ls')
    print(tel.get())


